package org.zjt.book

/**
  * trait：相当于jdk 8中的接口，可以有具体实现
  *
  * 同一个接口with多个实现：（多个实现过滤）
  *     对abstract接口的多重实现。实例中用with相互连接，从右向左执行
  *
  */
trait Log {

  def log(msg: String)=println(msg)

}

trait WranLog extends Log {

  override def log(msg: String): Unit = {
    super.log("wran:"+msg)
  }

}


trait shortLog extends Log {

  override def log(msg: String): Unit = {
    super.log("short:"+msg.substring(0,30))
  }

}


/**
  * 实体类
  */
class AccountLog extends Log{
  def desc(): Unit ={
    log(msg = "zhang")
  }

  override def log(msg: String): Unit = {
    super.log("AccountLog:"+msg)
  }

}


/**
  * 对象实例、执行的顺序：（父类 -> 接口 ->自己）
  *   1、先实例化父类构造函数（递归） （只能有一个父类）
  *   2、再实例化接口的方法  （从右向左）
  *   3、最后调用自己类中的方法
  *
  * 同一个方法执行顺序： shortLog -> WranLog -> 自己
  */
class AccountLog2 extends shortLog with WranLog{
  def desc(): Unit ={
    log(msg = "zhang")
  }

  override def log(msg: String): Unit = {
    super.log("AccountLog:"+msg)
  }

}


object LogStart extends App{

  //顺序： 继承同一个接口：  WranLog -> shortLog -> AccountLog  从后向前执行
  var log = new AccountLog with shortLog with WranLog
  log.log("------------zhang----------")


  //顺序： 父类 -> 接口 （从右向左） -> 执行自己类的实现
  var log2 = new AccountLog2
  log2.log("----------2zhang--------")

}
